// 对axios进行二次封装
//    axios本身是一个独立的库，是对ajax的封装。为了方便在项目中使用，我们对它再次封装
// (1) 接口基地址
// (2) 请求，响应拦截器

import axios from 'axios'
// import router from '../router'
import store from '../store/index'
import router from '../router/auth.js'

// 创建axios实例，配置
const request = axios.create({
  // 后端服务器1
  // baseURL: 'http://toutiao-app.itheima.net' // 请求的线上基础路径
  baseURL: 'http://localhost:8000' // 请求的本地基础路径
  // baseURL: 'http://192.168.15.28:8000' // 请求老师的基础路径
})

// 请求拦截器 config为本次请求用到的配置项
request.interceptors.request.use(function (config) {
  const token = store.state.tokenInfo.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  // console.log('config', config)
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  return response
}, async function (error) {
  // 如果发生了错误，判断是否是401
  // console.dir(error)
  // 开始处理
  if (error.response.status === 401) {
    const refreshToken = store.state.tokenInfo.refresh_token
    if (refreshToken) {
      try {
        const { data: { data } } = await axios({
          method: 'PUT',
          url: 'http://localhost:8000/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${refreshToken}`
          }
        })
        const newToken = data.token
        // 把新token保存到vuex
        store.commit('getToken', {
          token: newToken, // 变化了
          refresh_token: refreshToken // 没有变化
        })
        // request重发请求，它会自动去vuex中带上最新的token(没过期的，新的)
        return request(error.config)
      } catch (err) {
        // 1. 清空token
        // store.state.tokenInfo = {}
        store.commit('getToken', {})
        // 2. 回去登陆
        router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
        // 3. 返回错误信息
        return Promise.reject(new Error('请求新token失败'))
      }
    } else {
      // 1. 清空token
      // store.state.tokenInfo = {}
      store.commit('getToken', {})
      // 2. 回去登陆, 带上要返回的地址
      router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
      // 3. 返回错误信息
      return Promise.reject(new Error('refresh_token不存在'))
    }
  }
  return Promise.reject(error)
})

const request2 = axios.create({
  // 后端服务器2
  baseURL: 'http://api-toutiao-web.itheima.net'
  // timeout: 1000,
  // headers: {'X-Custom-Header': 'foobar'}
})

export { request, request2 }

// 默认导出intance1
export default request
